home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / misc / emu / Apex-src.lha / PRINTHAN.68K < prev    next >
Text File  |  2001-09-30  |  7KB  |  256 lines

  1. ;PRINTHAN.68K    SEP-14-86    (ALSO SEE "INFOSTR")
  2. ;GENERIC PRINTER HANDLER
  3. ;WRITTEN BY LOREN BLANEY FOR DFM ENGINEERING
  4. ;THIS IS BASED ON 6502 CODE WRITTEN BY P.J.R. BOYLE.
  5. ;
  6. ;REVISION HISTORY:
  7. ;SEP-14-86, MODIFIED SO THAT ONE SOURCE PRODUCES FOUR HANDLERS
  8. ;
  9. ;NOTES:
  10. ;This program is used to produce the following handlers, depending on
  11. ; the conditional assembly flags:
  12. ;    PARHAN, EPSONHAN, ITOHAN, DUMHAN
  13. ;
  14. ;This printer handler paginates and handles tabs. The printer should be
  15. ; configured so that a <CR> moves to the start of the current line, and
  16. ; a <LF> moves down one line.
  17. ;This will print 60 lines per page, with a half-inch margin at the top
  18. ; and bottom. It is assumed that the page is 11 inches long and that
  19. ; there are 6 lines per inch.
  20.  
  21.     NOLIST
  22.     INCLUDE    SYSPAG        ;GET SYSTEM-PAGE DEFINATIONS
  23.     LIST
  24.  
  25. ;SELECT ONLY ONE OF THE FOLLOWING BY SETTING IT TRUE:
  26. PARHAN    EQU    FALSE        ;NON-SPECIFIC PRINTER HANDLER
  27. EPSONHAN EQU    TRUE        ;EPSON PRINTER HANDLER
  28. ITOHAN    EQU    FALSE        ;C.ITOH PRINTER HANDLER
  29. DUMHAN    EQU    FALSE        ;DIRECT CONTROL, NO PAGINATION, ETC.
  30.  
  31. DEVNUM    EQU    2        ;PRINTER DEVICE NUMBER
  32.  
  33.     IF    EPSONHAN ! ITOHAN
  34. LINESIZ    EQU    97        ;NUMBER OF CHARACTERS +1 ON A LINE
  35.     ELSE
  36. LINESIZ    EQU    81        ;NUMBER OF CHARACTERS +1 ON A LINE
  37.     ENDIF
  38.  
  39. ;I/O ADDRESSES:
  40. CENDATA    EQU    $FFFFC1C1    ;CENTRONICS DATA OUTPUT PORT
  41. PPAR05    EQU    $FFFFC1C5    ;CENTRONICS CONTROL PORT
  42. CENSTAT    EQU    $FFFFC1C7    ;CENTRONICS STATUS PORT
  43. PPAR11    EQU    $FFFFC201    ;GENERAL OUTPUT PORT, LED RED +
  44.  
  45. PPAR05X    EQU    $FFFF80F1    ;COPY OF CENTRONICS CONTROL PORT
  46.  
  47.     ORG    MEMTOP- $1400
  48. START    EQU    @        ;ADDRESS WHERE THIS HANDLER STARTS
  49.  
  50. ;=======================================================================
  51. ;PRINTER HANDLER
  52. ;
  53. PRHAN    DC.L    DUMMY        ;0 = OPENI
  54.     DC.L    OPENO        ;1 = OPENO
  55.     DC.L    DUMMY        ;2 = CHIN
  56.     IF    DUMHAN
  57.     DC.L    BYTOUT        ;3 = BYTOUT, DIRECT OUTPUT
  58.     ELSE
  59.     DC.L    CHOUT        ;3 = CHOUT, WITH PAGING, TABS, ETC.
  60.     ENDIF
  61.     DC.L    CLOSE        ;4 = CLOSE
  62.     DC.L    GETINFO        ;5 = GETINFO
  63.     DC.L    BYTOUT        ;6 = BYTE OUT, LOW LEVEL OUTPUT
  64.     DC.L    DUMMY        ;7 = SPARE
  65.  
  66. HPOSN    DC.B    0        ;HORIZONTAL POSITION COUNTER
  67.                 ; (FIRST COLUMN = 0)
  68. LINE    DC.B    0        ;LINE COUNTER. TOP LINE = 0
  69.  
  70. ;-----------------------------------------------------------------------
  71. ;OPEN (INITIALIZE) BUFFERED TERMINAL FOR OUTPUT
  72. ;
  73. OPENO    MOVE.L    D0,-(SP)    ;SAVE D0
  74.  
  75.     IF    EPSONHAN
  76.     MOVEQ    #ESC,D0        ;SET ELITE MODE (96 COLUMNS)
  77.     BSR    BYTOUT
  78.     MOVEQ    #'M',D0
  79.     BSR    BYTOUT
  80.     ENDIF
  81.  
  82.     IF    ITOHAN
  83.     MOVEQ    #ESC,D0        ;SET ELITE MODE (96 COLUMNS)
  84.     BSR    BYTOUT
  85.     MOVEQ    #'E',D0
  86.     BSR    BYTOUT
  87.     ENDIF
  88.  
  89.     CLR.B    LINE.L        ;INIT LINE COUNTER TO FIRST LINE
  90.     BSR    DOCR        ;MAKE SURE WE'RE AT THE START OF
  91.                 ; THE LINE
  92.     MOVE.L    (SP)+,D0    ;RESTORE D0
  93.     RTS
  94.  
  95. ;-----------------------------------------------------------------------
  96. ;OUTPUT THE CHARACTER IN D0 TO THE PRINTER
  97. ; HANDLE SOME SPECIAL CHARACTERS: NUL, TAB, CR, & FF.
  98. ; THIS DOES NOT HANDLE DELETES (DEL)
  99. ;
  100. CHOUT    CMPI.B    #$20,D0        ;IS IT A CONTROL CHARACTER?
  101.     BHS.S    CHO190        ;(BHS) BRANCH IF NOT
  102.  
  103.     CMPI.B    #NUL,D0        ;IS IT A NULL CHARACTER?
  104.     BNE.S    CHO110        ;BRANCH IF NOT
  105. DUMMY    RTS            ;IGNORE NULLS
  106.  
  107. CHO110    CMPI.B    #TAB,D0        ;IS IT A TAB CHARACTER?
  108.     BNE.S    CHO120        ;BRANCH IF NOT
  109.     BRA    DOTAB        ;(PBRA) DO TAB AND RETURN
  110.  
  111. CHO120    CMPI.B    #CR,D0        ;IS IT A CARRIAGE RETURN?
  112.     BNE.S    CHO130        ;BRANCH IF NOT
  113.     BRA    NEWLIN        ;(PBRA) START A NEW LINE AND RETURN
  114.  
  115. CHO130    CMPI.B    #FF,D0        ;IS IT A FORM FEED?
  116.     BNE.S    CHO150        ;BRANCH IF NOT
  117.     BRA    NEWPAG        ;(PBRA) DO PAGE EJECT AND RETURN
  118.  
  119. CHO150    CMPI.B    #LF,D0        ;IS IT A LINE FEED?
  120.     BNE.S    CHO160        ;BRANCH IF NOT
  121.     RTS            ;IGNORE IT (THESE ARE STILL A PROBLEM)
  122.  
  123. CHO160    CMPI.B    #BS,D0        ;IS IT A BACKSPACE?
  124.     BNE.S    CHO190        ;BRANCH IF NOT
  125.     SUBQ.B    #1,HPOSN.L    ;DECREMENT X POSITION
  126.     BRA    BYTOUT        ;(PBRA) OUTPUT THE CHARACTER AND RETURN
  127.  
  128. CHO190    ADDQ.B    #1,HPOSN.L    ;BUMP X POSITION
  129.     CMPI.B    #LINESIZ,HPOSN.L ;ARE WE AT THE END OF THE LINE +1?
  130.     BLO.S    CHO195        ;BRANCH IF NOT
  131.     BSR    DOCRLF        ;START A NEW LINE
  132. CHO195    BRA    BYTOUT        ;(PBRA) OUTPUT THE CHARACTER AND RETURN
  133.  
  134. ;-----------------------------------------------------------------------
  135. ;CLOSE THE PRINTER
  136. ;
  137. CLOSE    BRA.S    NEWPAG        ;(PBRA) EJECT PAGE AND RETURN
  138.  
  139. ;-----------------------------------------------------------------------
  140. ;RETURN THE ADDRESS OF THE INFORMATION ARRAY IN D0
  141. ;
  142. GETINFO    MOVE.L    #INFO,D0
  143.     RTS
  144.  
  145. INFO    DC.L    START        ;STARTING AND ENDING ADDRESSES OF THIS
  146.     DC.L    END        ; HANDLER
  147.     DC.L    INFOSTR        ;DESCRIPTION
  148.  
  149.     IF    EPSONHAN
  150. INFOSTR    ASCII    'EPSONHAN  SEP-14-86  96-column Epson printe'
  151.     DC.B    'r' + $80
  152.     ENDIF
  153.  
  154.     IF    ITOHAN
  155. INFOSTR    ASCII    'ITOHAN    SEP-14-86  96-column C.Itoh printe'
  156.     DC.B    'r' + $80
  157.     ENDIF
  158.  
  159.     IF    PARHAN
  160. INFOSTR    ASCII    'PARHAN    SEP-14-86  80-column Generic printe'
  161.     DC.B    'r' + $80
  162.     ENDIF
  163.  
  164.     IF    DUMHAN
  165. INFOSTR    ASCII    'DUMHAN    SEP-14-86  Direct control of printe'
  166.     DC.B    'r' + $80
  167.     ENDIF
  168.  
  169. ;-----------------------------------------------------------------------
  170. ;SPACE OVER TO THE NEXT TAB STOP
  171. ;
  172. DOTAB    MOVE.L    D0,-(SP)    ;SAVE D0
  173. DOTAB10    MOVEQ    #SPACE,D0    ;OUTPUT A SPACE CHARACTER
  174.     BSR.S    BYTOUT
  175.  
  176.     ADDQ.B    #1,HPOSN.L    ;BUMP X POSITION
  177.     CMPI.B    #LINESIZ,HPOSN.L ;ARE WE AT THE END OF THE LINE +1?
  178.     BLO.S    DOTAB20        ;BRANCH IF NOT
  179.     BSR    DOCRLF        ;START A NEW LINE
  180.  
  181. DOTAB20    MOVE.B    HPOSN.L,D0    ;ARE WE AT THE NEXT TAB STOP?
  182.     ANDI.B    #$07,D0
  183.     BNE.S    DOTAB10        ;BRANCH IF NOT
  184.     MOVE.L    (SP)+,D0    ;RESTORE D0
  185.     RTS
  186.  
  187. ;-----------------------------------------------------------------------
  188. ;MOVE TO THE NEXT LINE
  189. ; CHECK FOR END-OF-PAGE
  190. ;
  191. NEWLIN    BSR.S    DOCRLF        ;MOVE DOWN A LINE
  192.     CMPI.B    #60,LINE.L
  193.     BLO.S    NL90        ;(BLO) BRANCH IF WE ARE (WE SCROLL)
  194.     BSR.S    NEWPAG
  195. NL90    RTS
  196.  
  197. ;-----------------------------------------------------------------------
  198. ;ADVANCE TO THE BEGINNING OF THE NEXT PAGE (FORM FEED)
  199. ;
  200. NEWPAG    BSR.S    DOCR        ;MAKE SURE WE'RE IN THE LEFT COLUMN
  201. NP10    BSR.S    DOLF        ;MOVE DOWN A LINE UNTIL WE'RE AT THE
  202.     CMPI.B    #66,LINE.L    ; TOP OF THE NEXT PAGE
  203.     BLO.S    NP10        ;(BLO) 6 LINES PER INCH * 11 INCHES
  204.     CLR.B    LINE.L        ; = 66 LINES.  RESET LINE COUNTER
  205.     RTS
  206.  
  207. ;-----------------------------------------------------------------------
  208. ;ADVANCE TO THE BEGINNING OF THE NEXT LINE
  209. ;
  210. DOCRLF    BSR.S    DOCR        ;OUTPUT A CARRIAGE RETURN & A LINE FEED
  211.     BRA.S    DOLF        ;(PBRA)
  212.  
  213. ;-----------------------------------------------------------------------
  214. ;OUTPUT A CARRIAGE RETURN
  215. ;
  216. DOCR    MOVE.L    D0,-(SP)    ;SAVE D0
  217.     MOVEQ    #CR,D0        ;OUTPUT A CARRIAGE RETURN
  218.     BSR.S    BYTOUT
  219.     CLR.B    HPOSN.L        ;RESET HORIZONTAL POSITION TO 0
  220.     MOVE.L    (SP)+,D0    ;RESTORE D0
  221.     RTS
  222.  
  223. ;-----------------------------------------------------------------------
  224. ;OUTPUT A LINE FEED
  225. ;
  226. DOLF    MOVE.L    D0,-(SP)    ;SAVE D0
  227.     MOVEQ    #LF,D0        ;OUTPUT A LINE FEED
  228.     BSR.S    BYTOUT
  229.     ADDQ.B    #1,LINE.L    ;COUNT THIS LINE
  230.     MOVE.L    (SP)+,D0    ;RESTORE D0
  231.     RTS
  232.  
  233. ;======================================================================
  234. ;LOW-LEVEL ROUTINE TO OUTPUT THE BYTE IN D0 TO THE PRINTER
  235. ;
  236. BYTOUT    BTST    #4,CENSTAT    ;WAIT UNTIL NOT BUSY
  237.     BNE.S    BYTOUT        ; I.E: UNTIL BIT #4 IS LOW
  238.  
  239.     MOVE.B    D0,CENDATA    ;OUTPUT THE DATA BYTE
  240.  
  241.     BCLR    #4,PPAR05X    ;DELAY AT LEAST 1 US THEN
  242.     MOVE.B    PPAR05X,PPAR05    ; SET STROBE BIT LOW (TRUE)
  243.     BSET    #4,PPAR05X    ;DELAY AT LEAST 1 US THEN
  244.     MOVE.B    PPAR05X,PPAR05    ; SET STROBE BIT HIGH (FALSE)
  245.     RTS
  246.  
  247. END    EQU    @        ;ADDRESS WHERE THIS HANDLER ENDS +1
  248.  
  249. ;-----------------------------------------------------------------------
  250. ;HOOK THIS HANDLER INTO THE DEVICE-HANDLER TABLE
  251. ;
  252.     ORG    4 *DEVNUM +DEVTBL
  253.     DC.L    PRHAN
  254.  
  255.     END
  256. -